package org.lanqiao.taru.aspectj;


import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 切面类
 * 日志记录（记录方法执行的时间差  ）
 */
@Slf4j
/*@Aspect
@Component*/
public class LogAspectj {
    /**
     * 定义切点（什么方法进行监控）
     * pointCut  相当于切点的ID
     */
    @Pointcut("execution( public *  org.lanqiao.taru.service..*(..))")
    public  void pointCut(){
    }

    /**
     * 注解切点
     */
    @Pointcut("@annotation(org.lanqiao.taru.annotation.Monitor)")
    public  void pointCut2(){
    }



    /**
     * 环绕通知
     * @return
     * @throws Throwable
     */
    @Around("pointCut2()")
    public Object loginfo(ProceedingJoinPoint joinPoint) throws Throwable {
            //开始时间
            long  start  = System.currentTimeMillis();
            //方法放行
            Object proceed = joinPoint.proceed();
            //结束时间
            long  end  = System.currentTimeMillis();
            //获取监控的方法名
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();

            log.info("{}方法性能监控时间为:{}",method.getName(),end-start);
            return proceed;

    }

}
